手作業で行っていたpipenv installをdirenvのlayoutに任せてみた
Pythonの仮想環境をセットアップする必要がでてくると、これまでは以下の手続きを取っていました。
% pipenv sync --dev % direnv edit . source .venv/bin/activate % direnv allow .
.envrc
は既にグローバルの .gitignore
へ追加済みの上で、惰性の操作になりつつあったので余り気にしていませんでしたが、ディレクトリ内にPipenv.lockファイルが無い状態でうっかり実行するとエラーになるのが鬱陶しい。
移動したらこのあたりの操作が全部勝手に行われると楽なんだけどな、と思いながらdirenvを弄っていたところ layout
コマンドの存在を知り、もしやと思いソースコードを辿ってみた結果 layout pipenv
の存在を見つけました。
direnvを通しての手軽な仮想環境設営手順について書いてみることにします。
layout コマンドについて
direnv についてはhomebrew等で導入してください。
brew install direnv
layoutコマンドは仮想環境設定の手続きをdirenvが引き受けるもので、やっていることは環境変数の判定や仮想環境作成等、これまで手作業やrcファイル等に記述していたものとなります。
今回利用するpipenvの場合。Pipfileを有無チェックと、virtualenv作成、そしてvirtualenvのパスを通しつつの環境変数設定で、日頃無意識なりでやっていることを自動で賄ってくれます。
layout_pipenv() { PIPENV_PIPFILE="${PIPENV_PIPFILE:-Pipfile}" if [[ ! -f "$PIPENV_PIPFILE" ]]; then log_error "No Pipfile found. Use \`pipenv\` to create a \`$PIPENV_PIPFILE\` first." exit 2 fi VIRTUAL_ENV=$(pipenv --venv 2>/dev/null ; true) if [[ -z $VIRTUAL_ENV || ! -d $VIRTUAL_ENV ]]; then pipenv install --dev VIRTUAL_ENV=$(pipenv --venv) fi PATH_add "$VIRTUAL_ENV/bin" export PIPENV_ACTIVE=1 export VIRTUAL_ENV }
layout pyenv
もあるのですが、既にpipenvを使っている場合はvirtualenvのパスが異なるため今回は使いません。
実際に使ってみる
.envrc
に追加して有効にします。
% echo "layout pipenv" >> .envrc % direnv allow . direnv: ([/usr/local/bin/direnv export zsh]) is taking a while to execute. Use CTRL-C to give up. Creating a virtualenv for this project... Pipfile: /path/to/Pipfile Using /path/to/bin/python3.7m (3.7.10) to create virtualenv... ⠙ Creating virtual environment...created virtual environment CPython3.7.10.final.0-64 in 3043ms creator CPython3Posix(dest=/path/to/.venv, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/xxxx/Library/Application Support/virtualenv) added seed packages: pip==21.1.3, setuptools==57.0.0, wheel==0.36.2 activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator ✔ Successfully created virtual environment! Virtualenv location: /path/to/.venv Installing dependencies from Pipfile.lock (384f77)... % which python /path/to/.venv/bin/python
pipenv sync
ではないため、lockファイルの更新差分反映については手動で行う必要があります。
あとがき
これまではvirtualenvの設定を手動で、activateの呼び出しをdirenvで行っていました。今後は基本一通りをdirenvに任せることにしようと思います。